package com.myCode.thread;

/**
 * 线程开放：就类似共享变量，这种共享数据往往会照成线程安全问题
 * 线程封闭：数据被封闭在各自的线程中，就不需要同步而避免使用同步
 * 线程封闭具体的体现有：ThreadLocal、局部变量
 *
 * ThreadLocal 是 java 里一种特殊的变量
 * 每个线程都有一个ThreadLocal就是每个线程都拥有了自己独立的变量，竞争条件被彻底消除了，保证并发模式下是绝对安全的变量
 *
 */
public class ThreadClose {
    /**
     * ThreadLocal 会自动在每个线程上创建一个T的副本，副本之间彼此独立，互不影响
     * 可以用 ThreadLocal 存储一些参数，以便在线程中多个方法中使用，用来代替方法传参的做法。
     */
    private static ThreadLocal<String> value = new ThreadLocal<String>();

    public void threadLocalTest() throws InterruptedException {
        value.set("这是" + Thread.currentThread().getName()+"设置的123");
        String s = value.get();
        System.out.println("线程1执行之前，主线程取到的值：" + s);

        new Thread( () ->{
            String v = value.get();
            System.out.println("线程1执行之后，取到的值：" + v);
            value.set("这是" + Thread.currentThread().getName()+"线程设置的456");

            String s1 = value.get();
            System.out.println("重新设置之后，线程1取到的值：" + s1);
            System.out.println("线程1执行结束");
        }).start();

        Thread.sleep(5000L);
        String s1 = value.get();
        System.out.println("线程1结束之后，主线程取到的值：" + s1);
    }
}
